#   导入需要用到的包
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys
import time
import json
from lxml import etree
import csv


#   设置目标网站的url
url='https://q.yingjiesheng.com/jobs/search/%E6%95%B0%E6%8D%AE%E5%88%86%E6%9E%90?'
#   定义自动化的浏览器驱动(executabl_path指定浏览器驱动的路径) 这里使用的是微软的浏览器
driver=webdriver.Edge(executable_path=r'D:\学习资料\python网络爬虫\微软浏览器驱动\msedgedriver.exe')

#  打开浏览器(因为如果重新打开浏览器直接加载cookie会无效，所以需要先进去，然后加载cookies，再跳转到那个网页，再刷新网页才可以避免重新登录)
driver.get(url)

#    加载之前保存的cookie为了跳过登录
with open('cookies.json','r',encoding='utf-8') as file:
    cookies=file.read()
for x in range(len(cookies.split("\n"))-1):
    #   因为按照换行符分割会得到一个空值的数据，所以将那一行数据排除掉
    if x!=len(cookies.split("\n"))-1:
        data_dict=json.loads(cookies.split("\n")[x])
        #   判断是否含有时间戳类型的值，有的话将时间戳更换为当前的时间戳，因为之前存的cookie是当时的时间戳，现在已经过期了
        #   所以需要将时间戳换成当前时间，还要往后面一些的时间戳
        if 'expiry' in data_dict:
            data_dict['expiry'] = int(time.time() + 86400)
            #   secure=True才可以使用https://协议访问网页
            data_dict['secure'] = True
            # print(data_dict)
            driver.add_cookie(data_dict)
        else:
            data_dict['secure'] = True
            # print(data_dict)
        driver.add_cookie(data_dict)

#  打开浏览器
driver.get(url)
#   刷新网页
driver.refresh()
#  将页面最大化
driver.maximize_window()
time.sleep(13)

#   定义爬取数据的方法
def get_data():
    #   下面开始爬取数据
    #   拿到html源码
    html_data = driver.page_source
    #   创建xpath解析对象，添加html源码
    html = etree.HTML(html_data)

    #   由于招聘信息不是使用ol里面嵌套li的格式，而是使用的div嵌套，所以就不能先拿到整个招聘信息，再根据层级递进的方法实现爬取数据
    #   所以下面是使用的//a表示拿到整个招聘信息里面任意a下面所有元素
    div_list = html.xpath('//*[@id="list"]/div[1]')
    #   上面得到是一个列表，里面是html元素，下面开始遍历逐步拿到需要的信息
    for x in div_list:
        #   拿到当前页所有的职业名字(name)
        name_list = x.xpath('//a/div/div[1]/div[1]/div/div/text()')
        print("所有的职业名称:", name_list, "数量为:", len(name_list))
        time.sleep(2)
        #   拿到所有的位置(position)
        position_list = x.xpath('//a/div/div[1]/div[2]/span[1]/text()')
        print("所有的位置:", position_list, "数量为:", len(position_list))
        time.sleep(2)
        #   拿到所有的薪资待遇(money)
        #   由于薪资待遇有的没有标注出来，所以需要以另外的方式爬取，如果没有标注就用"没写"代替
        #   定义新列表存储薪资的数据
        money_list = []
        for j in range(1, 21):
            #   定义xpath路径
            xpath_str = '//*[@id="list"]/div[1]/div[' + str(j) + ']/a/div/div[2]/div[1]/text()'
            money = html.xpath(xpath_str)
            #   判断薪资是否标注，没有标注的使用"没写"代替
            if money == []:
                money = "没写"
            money_list.append(money[0])
            # print("第",j,"个为:",money)
        print(money_list)
        time.sleep(2)
        #   拿到每个招聘信息的公司名称(corporation_name)
        corporation_name_list = x.xpath('//a/div/div[1]/div[3]/div[1]/text()')
        print("所有的公司名称:", corporation_name_list, "数量为:", len(corporation_name_list))
        time.sleep(2)
        #   拿到所有招聘信息的公司特征(trait)
        #   由于网页的结设计和招聘信息参数的不统一下面需要用到逐级爬取数据
        trait_list = []
        for j in range(1, 21):
            #   定义xpath路径
            xpath_str = '//*[@id="list"]/div[1]/div[' + str(j) + ']/a/div/div[1]/div[3]/div/text()'
            trait = html.xpath(xpath_str)
            trait_list.append(trait[1:])
            # print("第",j,"个为:",trait)
        print(trait_list)
        time.sleep(2)
        #   拿到所有的招聘要求(demand)
        #   由于招聘要求存在不确定数量，并且和位置放在一行，所以也需要用到逐级爬取
        demand_list = []
        for j in range(1, 21):
            #   定义xpath路径
            xpath_str = '//*[@id="list"]/div[1]/div[' + str(j) + ']/a/div/div[1]/div[2]/span/text()'
            demand = html.xpath(xpath_str)
            demand_list.append(demand[1:])
            # print("第",j,"个为:",trait)
        print(demand_list)
        time.sleep(2)
        #   拿到所有招聘信息的url地址(url)
        url_list = []
        for j in range(1, 21):
            #   定义xpath路径
            xpath_str = '//*[@id="list"]/div[1]/div[' + str(j) + ']/a/@href'
            # x='//*[@id="list"]/div[1]/div[6]/a'
            url = html.xpath(xpath_str)
            url_list.append(url[0].split("=")[0])
            # print("第",j,"个为:",url[0].split("=")[0])
        print(url_list)
        time.sleep(2)
        #   将数据写入到文件里面
        #   定义字段名
        #   将数据保存到rows里面
        rows = []
        for g in range(0, 20):
            rows.append([
                name_list[g], position_list[g], money_list[g], corporation_name_list[g], trait_list[g], demand_list[g],
                url_list[g]
            ])
        with open('all_datas.csv', 'a', newline='', encoding='utf-8') as file:
            #   创建csv写入对象
            writer = csv.writer(file)
            #   写入招聘信息的数据
            writer.writerows(rows)

            #   当前页的数据爬取完了，点击下一页，继续爬取数据
            #   拿到下一页的元素位置
            next_button = driver.find_element_by_xpath('//*[@id="list"]/div[1]/div[21]/div/button[2]')
            #   点击
            next_button.click()
            #   等待5秒等待网页加载完毕
            time.sleep(5)

for x in range(1,51):
    print("第", x, "页开始爬取.......")
    get_data()



#   关闭浏览器
driver.close()









